package lambda04;

import lambda03.Calculator;
import org.junit.Test;

/**
 * Lambda表达式的原理
 *  类似于匿名内部类的思想
 *  1.为每个Lambda表达式生成对应的接口的实现类
 *  2.重写该接口中的唯一方法,重写方法体就来自对应的Lambda表达式{}中的内容
 *  3.在使用到Lambda表达式的时候,会创建这个实现类对象
 */
public class LambdaDemo01 {
    public void method(String str, Printer p){
        p.print(str);
    }

    @Test
    public void testMethod01() {
        method("你好Lambda表达式",(String str)->{
            System.out.println(str);
        });
    }

    @Test
    public void test02()throws Exception {
        Printer p = str -> System.out.println(str);//相当于 Printer p = new LambdaDemo01$$Lambda();
        System.out.println(p);

        System.out.println(p.getClass());

        for (Class<?> in : p.getClass().getInterfaces()) {
            System.out.println(in);
        }

        System.out.println(p.getClass().getMethod("print", String.class));
    }

    @Test
    public void test03(){
        Printer p = str -> System.out.println(str);
        p.print("abc");
    }

}

/*
public class LambdaDemo01 {
    @Test
    public void test01() {
        method("你好Lambda表达式",new LambdaDemo01$$Lambda$1());
     }

    public void method(String str, Printer p) {//String str= "你好Lambda表达式"
                                               //Printer p = new LambdaDemo01$$Lambda() //多态
        p.print(str);
    }

    //在程序运行期间,会为每个Lambda表达式生成对应接口的实现类
    //重写接口中的唯一抽象方法,重写的方法体就是Lambda表达式大括号中的内容
    //在使用到Lambda表达式的地方,会通过创建该实现类的对象代替Lambda表达式
    //(String str)->{System.out.println(str);}对应的实现类
    class LambdaDemo01$$Lambda implements Printer{
        //重写抽象方法
        public void print(String str){
           System.out.println(str);
        }
    }

}
*/
